/** Request 网络请求工具 更详细的 api 文档: https://github.com/umijs/umi-request */
import { extend } from 'umi-request';
import { notification } from 'antd';
import { history } from 'umi';
import StorageManager from '@/utils/StorageManager';
import { BASE_URL } from '@/constants/global.const';

export type TError = {
  response: {
    status?: number;
    statusText?: string;
    message?: string;
    error?: number;
    error_description?: string;
    error_message?: string;
  };
};

export type TResult<T> = {
  data: T | null;
  code: number;
  message: string;
  msg: string;
  Disposition?: string;
};

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

/** 异常处理程序 */
const errorHandler = (error: TError) => {
  let { response } = error;
  if (response && response.status) {
    // @ts-ignore
    const errorText = codeMessage[response.status] || response.statusText;
    response.error = response.status;
    response.error_description = errorText;
    response.error_message = response.message;
  } else if (!response) {
    response = {
      error: -1,
      error_description: '您的网络发生异常，无法连接服务器',
    };
  }

  return response;
};
/** 配置request请求时的默认参数 */

const requestExtend = extend({
  // suffix: ".json",
  errorHandler,
  // 默认错误处理
  // credentials: 'include', // 默认请求是否带上cookie
});

const checkOptions = (opt: Record<string, any>) => {
  const options = { ...opt };
  // trimOptions(options.data);
  if (opt.method.toLowerCase() === 'get') {
    const { data, ...rest } = options;
    return {
      ...rest,
      params: data,
    };
  }
  return options;
};

const request = async <T>(url: string, opt = {}) => {
  const options = checkOptions(opt);
  const { headers = {}, showError = true, useCrmToken = false, ...rest } = options;

  const token = StorageManager.getSessionStorageSimpleSync('storage-token');
  const Authorization = token ? `Bearer ${token}` : '';
  const res = await requestExtend(url, {
    prefix: `${BASE_URL}`,
    headers: {
      Accept: '*/*',
      'Content-Type': 'application/json',
      'Cache-Control': 'no-cache',
      Authorization: Authorization,
      ...headers,
    },
    method: 'get',
    timeout: 30000,
    ...rest,
    // data: {
    //   params: JSON.stringify({ ...rest.data }),
    //   timestamp: Date.now(),
    //   token: token,
    // },
    data: rest.data,
  });

  console.log('res===res', res);
  return res;

  const Disposition = res?.response?.headers.get('Content-Disposition') || '';

  const result: TResult<T> = {
    data: res instanceof Blob ? res : res.data,
    code: res instanceof Blob ? 200 : res.code || res.errorCode || '',
    message: res.message || res.errorMsg || res.statusText || '',
    msg: res.message || res.errorMsg || res.statusText || '',
    Disposition: Disposition,
  };

  // useCrmToken---是否使用crm token，退出登录使用的方法不一样,调用主应用的方法
  if (Number(result.code) !== 200 && Number(result.code) !== 0 && showError) {
    notification.error({
      key: 'global_error_popup',
      message: `请求错误 ${url}`,
      description: `${result.message}(${result.code})`,
      duration: 3,
      onClose: () => {
        // 40003 token无效或者已过期
        if (result.code === 40003 && result.msg !== '当前用户没有此接口权限') {
          StorageManager.removeLocalStorageSync('token');
          const newHash = location.hash.replace('coupon-admin-portal/', ''); // 退户登录后coupon-admin-portal/重复导致路径报错
          history.replace(`/login?redirect=${newHash.replace('#', '')}`);
        }
      },
    });
  }
  return result;
};
export default request;
